import BaseSingleClass from "./BaseSingleClass";
/**
 * 简易的对象池实现
 * 用于对象的存贮和重复使用
 * 可以有效减少对象创建开销和避免频繁的垃圾回收
 * 提高游戏性能
 */
export default class Pool extends BaseSingleClass{
    private map=new Map<string,any[]>()
    /**
     * 根据对象标识符
     * 获取对应的对象池
     * @param name 
     * @returns 
     */
    private getPoolBySign(name:string):any[]{
        let result=this.map.get(name)
        if(result==undefined){
            this.map.set(name,[])
        }
        //result=
        return this.map.get(name)
    }
    /**
     * 根据传入的对象标识符，查询对象池
     * 对象池为空创建新的类，否则从对象池中取
     * @param name 
     * @param className 
     * @returns 
     */
    getItemByClass<T>(name:string,className:new () => T):T{
        const arr=this.getPoolBySign(name)
        //console.log(arr.length)
        if(arr.length>0){
            //console.log('shift')
            return arr.shift()
        }
        return new className()
    }
    /**
     * 将对象回收到对象池
     * 方便后续继续使用
     */
    recover(name:string, instance:any):void{
        this.getPoolBySign(name).push(instance)
    }
}